
package com.ce.pms.customer.vo;

import com.ce.pms.common.model.SysrefcodeDO;
import com.ce.pms.common.web.ICacheManage;
import com.ce.pms.customer.model.ClientDO;
import com.ce.pms.exception.BusinessException;
import com.ce.util.BlankUtil;
import com.sitechasia.webx.core.model.IViewObject;

/**
 * 功能描述: 住户VO类
 * <p>
 * 版权所有：中企动力
 * <p>
 * 未经本公司许可，不得以任何方式复制或使用本程序任何部分
 *
 * @author 付湘辉
 * Created on 2008-05-22
 */
public class CustomerVO implements ICacheManage<CustomerVO>, IViewObject {

	/**
	 * 个人代码 001
	 */
	public static final String INDIVIDUAL_CODE = SysrefcodeDO.PARTICIPANT_TYPE_INDIVIDUAL;

	/**
	 * 租户代码 002
	 */
	public static final String LESSEE_CODE = ClientDO.CT_LESSEE;

	/**
	 * 租户(个人)
	 */
	public static final String LESSEE_INDIVIDUAL = "租户(个人)";

	/**
	 * 租户(企业)
	 */
	public static final String LESSEE_ORGNIZATION = "租户(企业)";

	/**
	 * 企业代码 002
	 */
	public static final String ORGNIZATION_CODE = SysrefcodeDO.PARTICIPANT_TYPE_ORGANIZATION;


	/**
	 * 业主代码 001
	 */
	public static final String OWNER_CODE = ClientDO.CT_OWNER;

	/**
	 * 业主(个人)
	 */
	public static final String OWNER_INDIVIDUAL = "业主(个人)";

	/**
	 * 业主(企业)
	 */
	public static final String OWNER_ORGNIZATION = "业主(企业)";

	/**
	 * long：serialVersionUID
	 */
	private static final long serialVersionUID = 5625300781892360332L;

	/**
	 * 证件号码（法人/个人）
	 */
	protected String certificateNo;

	/**
	 * 证件类型Id（法人/个人）
	 */
	protected Long certificateType;

	/**
	 * 证件类型编号（法人/个人）
	 */
	protected String certificateTypeCode;

	/**
	 * 是否保存的状态标志
	 * saved 代表已保存过 unsave 代表还没有保存过
	 */
	protected String hasSave;

	/**
	 * 缓存中的索引位置
	 */
	protected Integer index;

	/**
	 * 修改前的参与人ID
	 */
	protected Long oldParticipantId;

	/**
	 * 操作状态：<br>
	 * add 新增 <br>
	 * edit 修改 <br>
	 * delete 删除 <br>
	 * done 已保存<br>
	 */
	protected String opratorStatus;

	/**
	 * 参与人ID
	 */
	protected Long participantId;

	/**
	 * 姓名/企业名称（对于企业具有唯一性）
	 */
	protected String participantName;

	/**
	 * 联系电话（个人电话/企业 ）
	 */
	protected String telephone;

	/**
	 * 证件类型名称（法人/个人）
	 */
	private String certificateTypeName;

	/**
	 * 操作用户的id
	 */
	private Long creator;

	/**
	 * 住户类型值
	 * 业主（个人） 业主（企业） 租户（个人） 租户（企业）
	 */
	private String customerType;

	/**
	 * 住户类型编码 001 //业主） 002 //（租户）
	 */
	private String customerTypeCode;

	/**
	 * 参与人类型编码 001 //个人） 002 //（企业）
	 */
	private String participantTypeCode;


	/**
	 *
	 * 功能描述: 空 构造器
	 *
	 * @author 付湘辉
	 * Created on:2008-6-6
	 *
	 * @roseuid 4833F31A003E
	 */
	public CustomerVO() {
		super();
	}

	/**
	 *
	 * 功能描述: 构造器
	 *
	 * @author 付湘辉
	 * Created on:2008-6-6
	 *
	 * 修改原因：
	 * @param participantId
	 * @param participantName
	 * @param telephone
	 * @param certificateType
	 * @param certificateNo
	 * @param opratorStatus
	 * @param hasSave
	 * @param customerType
	 * @param certificateName
	 * @param index
	 * @param customerTypeCode
	 */
	public CustomerVO(Long participantId,
					  String participantName,
					  String telephone,
					  Long certificateType,
					  String certificateNo,
					  String opratorStatus,
					  String hasSave,
					  String customerType,
					  String certificateName,
					  Integer index,
					  String customerTypeCode) {
		super();
		this.participantId = participantId;
		this.participantName = participantName;
		this.telephone = telephone;
		this.certificateType = certificateType;
		this.certificateNo = certificateNo;
		this.opratorStatus = opratorStatus;
		this.hasSave = hasSave;
		this.customerType = customerType;
		this.certificateTypeName = certificateName;
		this.index = index;
		this.customerTypeCode = customerTypeCode;
	}


	/**
	 * 功能描述: 完整构造器
	 *
	 * @author 付湘辉
	 * Created on:2008-6-6
	 *
	 * 修改原因：
	 * @param participantId
	 * @param participantName
	 * @param telephone
	 * @param certificateType
	 * @param certificateTypeCode
	 * @param certificateTypeName
	 * @param certificateNo
	 * @param opratorStatus
	 * @param hasSave
	 * @param customerType
	 * @param index
	 * @param customerTypeCode
	 * @param participantTypeCode
	 * @param creator
	 */
	public CustomerVO(Long participantId,
				      String participantName,
				      String telephone,
				      Long certificateType,
				      String certificateTypeCode,
				      String certificateTypeName,
				      String certificateNo,
				      String opratorStatus,
				      String hasSave,
				      String customerType,
				      Integer index,
				      String customerTypeCode,
				      String participantTypeCode,
				      Long creator) {
		super();
		this.participantId = participantId;
		this.participantName = participantName;
		this.telephone = telephone;
		this.certificateType = certificateType;
		this.certificateTypeCode = certificateTypeCode;
		this.certificateTypeName = certificateTypeName;
		this.certificateNo = certificateNo;
		this.opratorStatus = opratorStatus;
		this.hasSave = hasSave;
		this.customerType = customerType;
		this.index = index;
		this.customerTypeCode = customerTypeCode;
		this.participantTypeCode = participantTypeCode;
		this.creator = creator;
	}

	/**
	 * 功能描述: 检查必填项 <br>
	 *
	 *
	 * Create author:付湘辉 <br>
	 * Create on:2008-11-19  <br>
	 * Edit author:  <br>
	 * Edit on:    <br>
	 * Why:     <br>
	 */
	public void checkRequiredField(){
		if (BlankUtil.isBlank(this.participantName)) {
			throw new BusinessException("common:mustFill_null_exception",
					BusinessException.WARNING);
		}
	}


	/**
	 * 功能描述: 比较索引大小确定排序，索引越大越靠前
	 *
	 * @author 付湘辉
	 * Created on:2008-6-5
	 *
	 * 修改原因：
	 * @return 如果指定对象索引小于、等于或大于该对象的索引，则分别返回负整数、零或正整数。
	 */
	public int compareTo(CustomerVO o) {
		Integer another = o.getIndex();
		Integer thisIndex = this.index;
		another = another == null ? 0 : another;
		thisIndex = thisIndex == null ? 0 : thisIndex;
		return another - thisIndex;
	}

	/**
	 * 功能描述: 首先对索引进行比较，如果索引为空，<br>
	 * 则比较id，id为空则比较证件类型和证件号码的组合，<br>
	 * 最后如果上述三者都为空，则返回false
	 *
	 * @author 付湘辉
	 * Created on:2008-6-4
	 *
	 * 修改原因：
	 * @return boolean 是否相等
	 */
	@Override
	public boolean equals(Object obj) {
		if (obj == null || !(obj instanceof CustomerVO)) {
			return false;
		}
		CustomerVO cusvo = (CustomerVO) obj;

		Long particiId = cusvo.getParticipantId();
		Long certiType = cusvo.getCertificateType();
		String certiNo = cusvo.getCertificateNo();
		String participantName = cusvo.getParticipantName();
		Integer index = cusvo.getIndex();

		if (this.index != null) {
			return this.index.equals(index);
		} else if (this.participantId != null) {
			return this.participantId.equals(particiId);
		} else if (INDIVIDUAL_CODE.equals(this.participantTypeCode)) {
			if (this.certificateType != null && this.certificateNo != null) {
				return (this.certificateType.equals(certiType) && this.certificateNo.equalsIgnoreCase(certiNo));
			}
		} else if (ORGNIZATION_CODE.equals(this.participantTypeCode)) {
			if (this.participantName != null) {
				return (this.participantName.equalsIgnoreCase(participantName));
			}
		}

		return false;
	}

	/**
	 * 功能描述: 获取证件号码（法人/个人）
	 *
	 * @author 付湘辉
	 * Created on:2008-6-6
	 *
	 * 修改原因：
	 * @return 返回结果
	 */
	public String getCertificateNo() {
		return certificateNo;
	}

	/**
	 * 功能描述: 获取证件类型Id（法人/个人）
	 *
	 * @author 付湘辉
	 * Created on:2008-6-6
	 *
	 * 修改原因：
	 * @return 返回结果
	 */
	public Long getCertificateType() {
		return certificateType;
	}

	/**
	 * 功能描述: 获取证件类型编号（法人/个人）
	 *
	 * @author 付湘辉
	 * Created on:2008-6-6
	 *
	 * 修改原因：
	 * @return 返回结果
	 */
	public String getCertificateTypeCode() {
		return certificateTypeCode;
	}

	/**
	 * 功能描述: 获取证件类型名称（法人/个人）
	 *
	 * @author 付湘辉
	 * Created on:2008-6-6
	 *
	 * 修改原因：
	 * @return 返回结果
	 */
	public String getCertificateTypeName() {
		return certificateTypeName;
	}

	/**
	 * 功能描述: 获取操作用户的id
	 *
	 * @author 付湘辉
	 * Created on:2008-6-6
	 *
	 * 修改原因：
	 * @return 返回结果
	 */
	public Long getCreator() {
		return creator;
	}

	/**
	 * 功能描述: 获取住户类型值
	 *
	 * @author 付湘辉
	 * Created on:2008-6-6
	 *
	 * 修改原因：
	 * @return 返回结果
	 */
	public String getCustomerType() {
		return customerType;
	}

	/**
	 * 功能描述: 获取住户类型编码
	 *
	 * @author 付湘辉
	 * Created on:2008-6-6
	 *
	 * 修改原因：
	 * @return 返回结果
	 */
	public String getCustomerTypeCode() {
		return customerTypeCode;
	}

	/**
	 * 功能描述: 获取是否保存的状态标志
	 *
	 * @author 付湘辉
	 * Created on:2008-6-6
	 *
	 * 修改原因：
	 * @return 返回结果
	 */
	public String getHasSave() {
		return hasSave;
	}

	/**
	 * 功能描述: 获取缓存中的索引位置
	 *
	 * @author 付湘辉
	 * Created on:2008-6-6
	 *
	 * 修改原因：
	 * @return 返回结果
	 */
	public Integer getIndex() {
		return index;
	}

	/**
	 * 功能描述: 获取修改前的参与人ID
	 *
	 * @author 付湘辉
	 * Created on:2008-6-16
	 *
	 * 修改原因：
	 * @return 修改前的参与人ID
	 */
	public Long getOldParticipantId() {
		return oldParticipantId;
	}

	/**
	 * 功能描述: 获取操作状态
	 *
	 * @author 付湘辉
	 * Created on:2008-6-6
	 *
	 * 修改原因：
	 * @return 返回结果
	 */
	public String getOpratorStatus() {
		return opratorStatus;
	}

	/**
	 * 功能描述: 获取参与人ID
	 *
	 * @author 付湘辉
	 * Created on:2008-6-6
	 *
	 * 修改原因：
	 * @return 返回结果
	 */
	public Long getParticipantId() {
		return participantId;
	}

	/**
	 * 功能描述: 获取姓名/企业名称（对于企业具有唯一性）
	 *
	 * @author 付湘辉
	 * Created on:2008-6-6
	 *
	 * 修改原因：
	 * @return 返回结果
	 */
	public String getParticipantName() {
		return participantName;
	}

	/**
	 * 功能描述: 获取参与人类型编码 001 //个人） 002 //（企业）
	 *
	 * @author 付湘辉
	 * Created on:2008-6-6
	 *
	 * 修改原因：
	 * @return 返回结果
	 */
	public String getParticipantTypeCode() {
		return participantTypeCode;
	}

	/**
	 * 功能描述: 获取联系电话（个人电话/企业 ）
	 *
	 * @author 付湘辉
	 * Created on:2008-6-6
	 *
	 * 修改原因：
	 * @return 返回结果
	 */
	public String getTelephone() {
		return telephone;
	}

	/**
	 * 功能描述: 设置证件号码（法人/个人）
	 *
	 * @author 付湘辉
	 * Created on:2008-6-6
	 *
	 * 修改原因：
	 * @param certificateNo the 证件号码（法人/个人） to set
	 */
	public void setCertificateNo(String certificateNo) {
		this.certificateNo = certificateNo;
	}

	/**
	 * 功能描述: 设置证件类型Id（法人/个人）
	 *
	 * @author 付湘辉
	 * Created on:2008-6-6
	 *
	 * 修改原因：
	 * @param certificateType the 证件类型Id（法人/个人） to set
	 */
	public void setCertificateType(Long certificateType) {
		this.certificateType = certificateType;
	}

	/**
	 * 功能描述: 设置证件类型编号（法人/个人）
	 *
	 * @author 付湘辉
	 * Created on:2008-6-6
	 *
	 * 修改原因：
	 * @param certificateTypeCode the 证件类型编号（法人/个人） to set
	 */
	public void setCertificateTypeCode(String certificateTypeCode) {
		this.certificateTypeCode = certificateTypeCode;
	}

	/**
	 * 功能描述: 设置证件类型名称（法人/个人）
	 *
	 * @author 付湘辉
	 * Created on:2008-6-6
	 *
	 * 修改原因：
	 * @param certificateTypeName the 证件类型名称（法人/个人） to set
	 */
	public void setCertificateTypeName(String certificateTypeName) {
		this.certificateTypeName = certificateTypeName;
	}

	/**
	 * 功能描述: 设置操作用户的id
	 *
	 * @author 付湘辉
	 * Created on:2008-6-6
	 *
	 * 修改原因：
	 * @param creator the 操作用户的id to set
	 */
	public void setCreator(Long creator) {
		this.creator = creator;
	}

	/**
	 * 功能描述: 设置住户类型值
	 *
	 * @author 付湘辉
	 * Created on:2008-6-6
	 *
	 * 修改原因：
	 * @param customerType the 住户类型值 to set
	 */
	public void setCustomerType(String customerType) {
		this.customerType = customerType;
	}

	/**
	 * 功能描述: 设置住户类型编码
	 *
	 * @author 付湘辉
	 * Created on:2008-6-6
	 *
	 * 修改原因：
	 * @param customerTypeCode the 住户类型编码 to set
	 */
	public void setCustomerTypeCode(String customerTypeCode) {
		this.customerTypeCode = customerTypeCode;
	}

	/**
	 * 功能描述: 设置是否保存的状态标志
	 *
	 * @author 付湘辉
	 * Created on:2008-6-6
	 *
	 * 修改原因：
	 * @param hasSave the 是否保存的状态标志 to set
	 */
	public void setHasSave(String hasSave) {
		this.hasSave = hasSave;
	}

	/**
	 * 功能描述: 设置缓存中的索引位置
	 *
	 * @author 付湘辉
	 * Created on:2008-6-6
	 *
	 * 修改原因：
	 * @param index the 缓存中的索引位置 to set
	 */
	public void setIndex(Integer index) {
		this.index = index;
	}

	/**
	 * 功能描述: 设置修改前的参与人ID
	 *
	 * @author 付湘辉
	 * Created on:2008-6-16
	 *
	 * 修改原因：
	 * @param oldParticipantId the 修改前的参与人ID to set
	 */
	public void setOldParticipantId(Long oldParticipantId) {
		this.oldParticipantId = oldParticipantId;
	}

	/**
	 * 功能描述: 设置操作状态
	 *
	 * @author 付湘辉
	 * Created on:2008-6-6
	 *
	 * 修改原因：
	 * @param opratorStatus the 操作状态 to set
	 */
	public void setOpratorStatus(String opratorStatus) {
		this.opratorStatus = opratorStatus;
	}

	/**
	 * 功能描述: 设置参与人ID
	 *
	 * @author 付湘辉
	 * Created on:2008-6-6
	 *
	 * 修改原因：
	 * @param participantId the 参与人ID to set
	 */
	public void setParticipantId(Long participantId) {
		this.participantId = participantId;
	}

	/**
	 * 功能描述: 设置姓名/企业名称（对于企业具有唯一性）
	 *
	 * @author 付湘辉
	 * Created on:2008-6-6
	 *
	 * 修改原因：
	 * @param participantName the 姓名/企业名称 to set
	 */
	public void setParticipantName(String participantName) {
		this.participantName = participantName;
	}

	/**
	 * 功能描述: 设置参与人类型编码 001 //个人） 002 //（企业）
	 *
	 * @author 付湘辉
	 * Created on:2008-6-6
	 *
	 * 修改原因：
	 * @param participantTypeCode the 参与人类型编码  to set
	 */
	public void setParticipantTypeCode(String participantTypeCode) {
		this.participantTypeCode = participantTypeCode;
	}

	/**
	 * 功能描述: 设置联系电话（个人电话/企业 ）
	 *
	 * @author 付湘辉
	 * Created on:2008-6-6
	 *
	 * 修改原因：
	 * @param telephone the 联系电话（个人电话/企业 ） to set
	 */
	public void setTelephone(String telephone) {
		this.telephone = telephone;
	}


}
